package com.itheima.task;

import com.itheima.common.constant.RedisConstant;
import com.itheima.common.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 定时任务类 -- 定时清理无效文件
 */
@Component
@Slf4j
public class FileTask {

    @Autowired
    private AliOssUtil aliOssUtil;
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 定时清理无效图片,每天清理一次
     */
    //@Scheduled(cron = "0 * * * * ?")
    @Scheduled(cron = "0 0 1 * * ?")
    public void clearImage() {
        log.info("定时清理无效图片开始");
        // 获取redis缓存中阿里云图片集合
        Set<String> imageUrls = redisTemplate.boundSetOps(RedisConstant.SETMEAL_PIC_RESOURCES).members();
        // 获取redis缓存中数据库中图片集合
        Set<String> dbImageUrls = redisTemplate.boundSetOps(RedisConstant.SETMEAL_PIC_DB_RESOURCES).members();
        // 清理redis缓存
        redisTemplate.delete(RedisConstant.SETMEAL_PIC_RESOURCES);
        redisTemplate.delete(RedisConstant.SETMEAL_PIC_DB_RESOURCES);
        // 如果阿里云图片集合为空,则无需清理
        if (imageUrls == null || imageUrls.isEmpty()) {
            log.info("没有需要处理的失效图片");
            return;
        }
        log.info("获取redis阿里云数组中图片集合:{}", imageUrls);
        // 如果数据库图片集合不为零,则从阿里云图片集合中删除相应的图片
        if (dbImageUrls != null && !dbImageUrls.isEmpty()){
            log.info("获取redis数据库数组中图片集合:{}", dbImageUrls);
            // 遍历redis数据库中图片数组
            for (String dbImageUrl : dbImageUrls) {
                // 去除掉imageUrls中的dbImageUrl元素
                imageUrls.remove(dbImageUrl);
            }
        }
        // 删除无效图片
        for (String imageUrl : imageUrls) {
            // 获取图片名称
            int index = imageUrl.lastIndexOf("/");
            String objectName = imageUrl.substring(index + 1);
            log.info("清理无效图片:{}", objectName);
            aliOssUtil.delete(objectName);
        }
    }
}
